#ifndef WEBSOCKETSERVER_H
#define WEBSOCKETSERVER_H

#include <QObject>
#include <QWebSocketServer>
#include <QWebSocket>
#include <QList>
#include <QString>
#include <QByteArray>

class BackendService;
class CommandExecutor;

class WebSocketServer : public QObject
{
    Q_OBJECT

public:
    explicit WebSocketServer(QObject *parent = nullptr);
    ~WebSocketServer();

    // 启动服务器
    bool startServer(quint16 port);

    // 停止服务器
    void stopServer();

    // 检查服务器是否运行
    bool isRunning() const;

    // 广播消息给所有客户端
    void broadcastMessage(const QString &message);

    // 发送消息给指定客户端
    void sendMessageToClient(const QString &clientId, const QString &message);

    // 设置 BackendService
    void setBackendService(BackendService *backendService);

signals:
    // 服务器启动
    void serverStarted(quint16 port);

    // 服务器停止
    void serverStopped();

    // 客户端连接
    void clientConnected(const QString &clientId);

    // 客户端断开
    void clientDisconnected(const QString &clientId);

    // 收到消息
    void messageReceived(const QString &clientId, const QString &message);

    // 错误发生
    void errorOccurred(const QString &errorString);

private slots:
    // 新连接处理
    void onNewConnection();

    // 文本消息接收
    void onTextMessageReceived(const QString &message);

    // 二进制消息接收
    void onBinaryMessageReceived(const QByteArray &message);

    // 套接字断开连接
    void onSocketDisconnected();

    // 服务器错误
    void onServerError();

private:
    // 生成客户端ID
    QString generateClientId(QWebSocket *socket);

    // 获取客户端ID
    QString getClientId(QWebSocket *socket);

    // 查找客户端
    QWebSocket* findClient(const QString &clientId);

private:
    QWebSocketServer *m_webSocketServer;
    QList<QWebSocket*> m_clients;
    BackendService *m_backendService;
    CommandExecutor *m_commandExecutor;
};

#endif // WEBSOCKETSERVER_H

